package com.hugedata.cdn.util;

import java.util.HashMap;
import java.util.Map;

/**
 * 
 * 项目名称：cdn 类名称：StringParametersUtil 类描述： 创建人：zhaoaihua 创建时间�?013-5-15 下午2:58:50
 * 修改备注�?
 * 
 * @version
 * 
 */
public class StringParametersUtil {

    // NORMAL，普通状�?
    // BEGIN，在 $ 字符之后
    // START，在 ${ 字符之后
    private static final int          NORMAL = 0, BEGIN = 1, START = 2;

    private final Map<String, Object> map    = new HashMap<String, Object>();

    private ValueCallbackHander       hander = new ValueCallbackHander() {
                                                 @Override
                                                 public Object getValue(
                                                         String key) {
                                                     return map.remove(key);
                                                 }
                                             };

    /**
     * 解析字符�?
     * 
     * @param value
     *            带有${name}占位符的字符�?
     */
    public String parse(String value) {

        // 保存结果字符串的字符串缓冲对�?
        StringBuilder result = new StringBuilder(value.length());

        // 保存每个参数名称的字符串缓冲对象
        StringBuilder param = new StringBuilder();

        // 保存状�?�?
        int mark = NORMAL;

        // 遍历字符�?
        for (int i = 0; i < value.length(); i++) {
            // 获取字符串指定字�?
            char c = value.charAt(i);

            // 根据字符值进行分�?
            switch (c) {
            case '$':
                // 对于状�?为NORMAL的情况，转为BEGIN状�?
                if (mark == NORMAL) {
                    mark = BEGIN;
                } else {
                    // 对于连续出现两个$字符的情况，忽略前一�?字符，维持BEGIN状�?
                    if (mark == BEGIN) {
                        result.append('$');
                    } else {
                        // 如果是其它状�?START)
                        result.append(c);
                    }
                }
                break;
            case '{':
                // 对于BEGIN状�?，将状�?转为START状�?
                if (mark == BEGIN) {
                    mark = START;
                } else {
                    // 对于其它状�?，统�?��为NORMAL
                    mark = NORMAL;
                    // 加入result字符�?
                    result.append(c);
                }
                break;
            case '}':
                if (mark == START) {
                    Object p = hander.getValue(param.toString());
                    if (p == null) {
                        p = "";
                    }
                    // 加入result字符�?
                    result.append(p.toString());
                    param.setLength(0);
                } else {
                    result.append(c);
                }
                // 对于START状�?，转为NORMAL状�?，并获取参数�?
                mark = NORMAL;
                break;
            default: // 对于其它字符
                if (mark == START) {
                    // 处理状�?为START�?
                    param.append(c);
                } else {
                    mark = NORMAL;
                }
                if (mark == NORMAL) {
                    // 处理状�?为NORMAL�?
                    result.append(c);
                }
            }
        }

        map.clear();

        return result.toString();
    }

    public void put(String key, Object value) {
        map.put(key, value);
    }

    /**
     * 测试
     */
    public static void main(String[] args) {

        StringParametersUtil ut = new StringParametersUtil();

        ut.put("name", "ok");
        ut.put("test", 1234);
        ut.put("ok", true);

        System.out.println(ut.parse("hello$${name}${test},{ok}{${ok}}"));

    }
}
